http://sumdu.edu.ua/cources/mo/rus/m_nspus.html
В методе наискорейшего спуска желательно использовать
рассмотренное свойство направления градиента. Поэтому, если мы находимся в точке
хi на некотором шаге процесса оптимизации, то поиск минимума функции
осуществляется вдоль направления - . Данный метод является итерационным. На
шаге i точка минимума аппроксимируется точкой хi .
Следующей аппроксимацией является точка
xi+1=xi - li,(3.17)
где li - значение l, минимизирующее функцию
j (li)=f[xi- l].(3.18)
Значение li может быть найдено с помощью одного из методов одномерного поиска (например, методом квадратичной интерполяции).
В приложении приведена программа, позволяющая реализовать метод наискорейшего спуска. В ней множитель Лагранжа обозначен через h. Вектор di является единичным.
Для поиска минимума функции
j( l)=f(xi- ldi) (3.19)
в направлении di из точки xi используется метод квадратичной интерполяции.
В точке xil= 0, и мы выбираем длину шага l такой, чтобы шаг "перекрыл " минимум функции j(l) . Производная
= g(xi-ldi)Tdi(3.20)
Данный оператор for(i=0;i<n;i++) g2+=g[i]*d[i]; - вычисляет выражение
= f(x0-hdi)Td=g(x0-hdi)Td (3.21)
Оператор if (ff[2]>=ff[0] || g2>=0) проверяет условие "перекрытия" минимума, которое выполняется при выполнении либо одного, либо другого условия. Если минимум не попал в отрезок (0,l), то l удваивается, и это повторяется столько раз, сколько необходимо для выполнения условия "перекрытия".
Удостоверившись, что отрезок (0,l) содержит минимум, в качестве третьей точки возьмем точку l/ 2. Минимальную точку сглаживающего квадратичного полинома находим в соответствии с соотношением
, (3.22)
что отражено следующими операторами
l[3]=h*(ff[1]-.75*ff[0]-.25*ff[2]);
l[3]/=2*ff[1]-ff[0]-ff[2];
Оператор for(i=0;i<n;i++)